SAVI is a vegetation index that introduces a soil brightness correction factor (L)
to reduce the influence of bare soil, especially in semi-arid and sparsely vegetated areas.
1. Scientific Definition
The Soil Adjusted Vegetation Index (SAVI) is a spectral vegetation index
designed to minimize the effect of soil background on vegetation signals.
It is particularly useful in regions with partial vegetation cover or exposed soil,
where classic NDVI can be strongly influenced by soil reflectance.
Formula
A common formulation of SAVI is:
SAVI = (1 + L) × (NIR − Red) / (NIR + Red + L)
Dimensionless (–1 to +1)
Where:
NIR = Near-InfraRed reflectance
Red = Red band reflectance
L = soil adjustment factor (0 ≤ L ≤ 1)
Typical values of L:
L = 0.0 → very high vegetation cover (behaves like NDVI)
L = 0.5 → intermediate vegetation density (most common choice)
L = 1.0 → very low vegetation cover / strong soil influence
Typical Interpretation
SAVI Range
Interpretation
< 0.0
Water, clouds, snow, or non-vegetated bright surfaces
0.0 – 0.2
Bare soil, rocks, built-up, or very sparse vegetation
Dense and healthy vegetation (croplands, forests in good condition)
Key Applications
Crop monitoring in semi-arid and dryland agriculture
Assessing vegetation cover over bright / exposed soils
Land degradation and desertification studies
Complementing NDVI in areas with mixed soil–vegetation pixels
2. Data & Bands for SAVI
Common Sensors & Bands
Sentinel-2 (ESA) – 10 m
Red: B4 (~665 nm)
NIR: B8 (~842 nm)
Landsat 8/9 OLI – 30 m
Red: B4
NIR: B5
Good Practice
Use atmospherically corrected surface reflectance products.
Choose L ≈ 0.5 for general use in semi-arid / mixed cover areas.
Filter out cloudy scenes using cloud masks or cloud percentage.
Clip the final SAVI raster to your Area of Interest (AOI) before exporting.
Use consistent dates when comparing SAVI across time or between sites.
Palette Suggestion
A sample SAVI color palette similar to NDVI:
[ "#440154", "#3b528b", "#21908c", "#5dc963", "#fde725" ]
3. Google Earth Engine Code – SAVI for Any AOI
Steps: open code.earthengine.google.com → New Script → paste the code →
draw your AOI as geometry on the map → click Run.
Then export SAVI as GeoTIFF to Google Drive.
// SAVI for any Area of Interest (AOI) using Sentinel-2 SR
// -------------------------------------------------------
// 1) Go to: https://code.earthengine.google.com
// 2) Click "New Script" and paste this code.
// 3) On the map: draw your AOI (Polygon/Rectangle).
// It will appear as a variable named 'geometry' in the left panel.
// 4) Click "Run" to display SAVI.
// 5) In the Tasks tab, click "Run" to export SAVI to Google Drive.
// -------------------------------------------------------
// 1. Define Area of Interest (AOI)
// -------------------------------------------------------
var roi = geometry; // Make sure a 'geometry' object exists in the left panel
// Center the map on the AOI
Map.centerObject(roi, 11);
// -------------------------------------------------------
// 2. Define time range
// -------------------------------------------------------
var startDate = '2023-01-01';
var endDate = '2023-12-31';
// -------------------------------------------------------
// 3. Load Sentinel-2 Surface Reflectance collection
// and keep only bands needed for SAVI
// -------------------------------------------------------
var s2 = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.select(['B4', 'B8']); // Red, NIR
// Create a median composite and clip to AOI
var image = s2.median().clip(roi);
// -------------------------------------------------------
// 4. Compute SAVI
// SAVI = (1 + L) * (NIR - Red) / (NIR + Red + L)
// Typical L = 0.5 for intermediate vegetation density
// -------------------------------------------------------
var L = 0.5;
var savi = image.expression(
'(1 + L) * (NIR - RED) / (NIR + RED + L)',
{
'L': L,
'NIR': image.select('B8'),
'RED': image.select('B4')
}
).rename('SAVI');
// -------------------------------------------------------
// 5. Visualization on the map
// -------------------------------------------------------
var saviVis = {
min: -1,
max: 1,
palette: [
'#440154', // low
'#3b528b',
'#21908c',
'#5dc963',
'#fde725' // high
]
};
// Add SAVI layer to the map
Map.addLayer(savi, saviVis, 'SAVI (Sentinel-2)', true);
// Optionally, also show a true color composite for context
var s2_rgb = ee.ImageCollection('COPERNICUS/S2_SR')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.select(['B4','B3','B2']) // RGB
.median()
.clip(roi);
Map.addLayer(s2_rgb, {min:0, max:3000}, 'True Color (RGB)', false);
// -------------------------------------------------------
// 6. Export SAVI as GeoTIFF to Google Drive
// -------------------------------------------------------
Export.image.toDrive({
image: savi,
description: 'SAVI_Export',
fileNamePrefix: 'SAVI_Export',
region: roi,
scale: 10, // Sentinel-2 resolution
crs: 'EPSG:4326',
maxPixels: 1e13
});
// End of script